// 数据量比较大，只能全局处理一次
// 写成类的静态成员会好些，没来得及弄
int MAX_VAL = 0;
vector<bool> isPrime;
void setup()
{
    if (MAX_VAL)
    {
        return;
    }
    MAX_VAL = 4'000'001;
    isPrime = vector<bool>(MAX_VAL, true);
    isPrime[0] = isPrime[1] = false;
    for (long long i = 2; i < MAX_VAL; ++i)
    {
        if (!isPrime[i])
        {
            continue;
        }
        for (long long k = i * i; k < MAX_VAL; k += i)
        {
            isPrime[k] = false;
        }
    }
}
class Solution
{
public:
    int diagonalPrime(vector<vector<int>> &nums)
    {
        setup();
        int n = nums.size();
        int maxPrime = 0;
        for (int i = 0; i < n; ++i)
        {
            if (isPrime[nums[i][i]])
            {
                maxPrime = max(maxPrime, nums[i][i]);
            }
            if (isPrime[nums[i][n - i - 1]])
            {
                maxPrime = max(maxPrime, nums[i][n - i - 1]);
            }
        }
        return maxPrime;
    }
};